package com.icongyou.enterprise.data_aggregation.service;

import com.icongyou.enterprise.common.result.PageResult;
import com.icongyou.enterprise.data_aggregation.entity.*;
import com.icongyou.enterprise.talent_pool.entity.vo.CoreSubmissionVO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface DataAggregationService {
    // 根据账号查询用户信息
    UserEntity getUserByAccount(String account);

    String selectTenantIdByName(String tenantName);

    Integer validateUserTenant(String userId, String tenantId);

    // 插入新用户记录
    int insertUser(UserEntity user);

    // 更新用户最后登录时间
    int updateUserLastLoginTime(String userId, LocalDateTime loginTime);

    // 根据条件查询学生列表
    List<UserEntity> getStudentByCondition(Map<String, Object> condition);

    // 根据学生ID查询学生信息
    UserEntity getStudentById(String studentId);

    // 根据ID查询用户信息
    UserEntity getUserById(String userId);

    // 查询学生选课信息
    List<CourseStudentEntity> getStudentCourse(String studentId);

    // 查询学生在特定课程中的进度信息
    CourseProgressEntity getStudentCourseProgress(String studentId, String courseId);

    // 查询学生在特定课程中的任务成绩
    List<AssignmentStudentEntity> getStudentAssignmentScore(String studentId, String courseId);

    // 查询学生对特定任务的提交记录
    List<SubmissionEntity> getStudentSubmission(String studentId, String assignmentId);

    // 查询提交作品的批改信息
    List<GradeEntity> getStudentGrade(String submissionId);

    // 查询课程中学生排名
    List<CourseStudentEntity> getCourseRanking(String courseId);

    // 查询学生所属团队信息
    List<TeamMemberEntity> getStudentTeam(String studentId);

    // 根据团队ID查询团队信息
    TeamEntity getTeamById(String teamId);

    // 查询学生在课程中的能力维度达成度
    String getStudentCompetencyLevel(String studentId, String courseId);

    // 查询教师对学生的评语
    List<GradeEntity> getTeacherComment(String studentId);

    // 聚合查询：获取学生原始指标（用于画像计算）
    Map<String, Object> getStudentRawMetrics(String studentId, Double passThreshold, Integer complexThreshold, Integer maxLateDays);

    // 根据租户ID获取租户信息
    TenantEntity getTenantById(String tenantId);

    // 根据课程ID获取课程信息
    CourseEntity getCourseById(String courseId);

    // 查询学生在特定课程中的所有提交记录
    List<SubmissionEntity> getStudentSubmissionsByCourse(String studentId, String courseId);

    // 获取所有学生ID列表
    List<String> getAllStudentIds();

    // 获取课程总分统计
    Map<String, Double> getCourseTotalScores();

    // 获取所有有效的硬技能标签
    List<String> getHardSkillTags();

    /**
     * 检查学生是否为教师推荐
     */
    Boolean isTeacherRecommended(String studentId);

    /**
     * 检查学生是否在核心任务top 30%
     */
    Boolean isCoreTaskTop30(String studentId);

    /**
     * 获取学生的核心成果（得分最高的提交）
     */
    CoreSubmissionVO getCoreSubmission(String studentId);

    /**
     * 获取同专业同校的学生总数
     * @param tenantId 租户ID
     * @param major 专业名称
     * @return 学生总数
     */
    Integer countStudentsByMajor(@Param("tenantId") String tenantId, @Param("major") String major);

    /**
     * 根据用户ID获取租户名称（学校名称）
     * @param userId 用户ID
     * @return 租户名称（学校名称）
     */
    String getTenantNameByUserId(String userId);

    // 添加关注标记
    int addFocusMark(String userId, String studentId, Integer tag);

    // 删除关注标记
    int removeFocusMark(String userId, String studentId);

    // 检查是否已关注
    StudentFocusMarkEntity getFocusMark(String userId, String studentId);

    // 获取任务信息
    AssignmentEntity getAssignmentInfo(String assignmentId);

    /**
     * 统计所有学生数量
     */
    Long countAllStudents();

    /**
     * 分页查询学生信息
     */
    List<UserEntity> getStudentsWithPagination(int offset, int size);

    /**
     * 批量获取任务信息
     */
    List<AssignmentEntity> getAssignmentsByIds(List<String> assignmentIds);

    /**
     * 获取所有截止任务的信息
     */
    List<AssignmentEntity> getAllCompletedAssignments();

    /**
     * 检查学生是否有高潜力成果
     */
    Boolean hasHighPotentialSubmission(String studentId);

    /**
     * 根据学生ID和任务ID获取核心成果
     * @param studentId 学生ID
     * @param assignmentId 任务ID
     * @return 核心成果VO
     */
    CoreSubmissionVO getCoreSubmissionByAssignmentId(String studentId, String assignmentId);
}